﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
using Zarzadzanie_Restautacja.Controllers;
using Zarzadzanie_Restautacja.Helpers;
using Zarzadzanie_Restautacja.Model;

namespace Zarzadzanie_Restautacja.Forms
{
    public partial class KelnerForm : Form
    {
        private List<potrawyViewHelper> potrawy_do_obsluzenia_kel = new List<potrawyViewHelper>();
        private List<potrawyViewHelper> potrawy_do_wydania_kel = new List<potrawyViewHelper>();
        List<ZamowieniaPotrawy> zamPotrDoZamkniecia = new List<ZamowieniaPotrawy>();

        public KelnerForm()
        {
            Obsluga kelner = new Obsluga();
            InitializeComponent();
            List<Potrawa> listaPotraw = new List<Potrawa>();
            using (RestauracjaContext context = new RestauracjaContext())
            {
                var a = context.Potrawy.Select(pot =>
                         new
                         {
                             Id = pot.Id,
                             Nazwa = pot.Nazwa,
                             Cena = pot.Cena
                         }).ToList();

                BindingSource bi = new BindingSource(a, null);
                this.dataGridView1.DataSource = bi;
                this.dataGridView1.Refresh();
            }
        }

        private List<Potrawa> pobierzPotrawy()
        {
            try
            {
                List<Potrawa> listaPotraw = new List<Potrawa>();
                using (RestauracjaContext context = new RestauracjaContext())
                {
                    listaPotraw = context.Potrawy.ToList();
                }
                return listaPotraw;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Wystapił błąd przy pobieraniu potraw");
                return null;
            }

        }

        private void KelnerForm_Load(object sender, EventArgs e)
        {
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow row in dataGridView1.SelectedRows)
            {
                potrawyViewHelper potrawa = new potrawyViewHelper();
                potrawa.Id = (int)row.Cells[0].Value;
                potrawa.Nazwa = row.Cells[1].Value.ToString();
                potrawa.Cena = decimal.Parse(row.Cells[2].Value.ToString());
                potrawy_do_obsluzenia_kel.Add(potrawa);

                this.textBox2.Text = this.potrawy_do_obsluzenia_kel.Sum(i => i.Cena).ToString();
            }

            lbPotrawyDoZamowienia.DataSource = null;
            lbPotrawyDoZamowienia.Refresh();

            lbPotrawyDoZamowienia.DataSource = potrawy_do_obsluzenia_kel;
            lbPotrawyDoZamowienia.DisplayMember = "Nazwa";
            lbPotrawyDoZamowienia.ValueMember = "Id";
            lbPotrawyDoZamowienia.Refresh();

        }

        private void dataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            List<Potrawa> listaPotraw = new List<Potrawa>();

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            string text = textBox1.Text.ToLower();
            if (!Regex.IsMatch(text, @"^[a-zA-Z]+$"))
            {
                BindingSource bi = new BindingSource(null, null);
                this.dataGridView1.DataSource = bi;
                this.dataGridView1.Refresh();
                MessageBox.Show("Podano nieprawidłowe znaki, proszę o podanie małych i dużych liter");
            }
            
            using (RestauracjaContext context = new RestauracjaContext())
            {
                var a = context.Potrawy.Where(pot => pot.Nazwa.ToLower().Contains(text)).Select(pot =>
                         new
                         {
                             Id = pot.Id,
                             Nazwa = pot.Nazwa,
                             Cena = pot.Cena
                         }).ToList();

                BindingSource bi = new BindingSource(a, null);
                this.dataGridView1.DataSource = bi;
                this.dataGridView1.Refresh();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            List<Potrawa> potrawy = new List<Potrawa>();
            int nrStolika = 1;
            if (!this.potrawy_do_obsluzenia_kel.Any())
            {
                MessageBox.Show("Nie ma potraw w zamowieniu");
                return;
            }

            foreach (var item in this.potrawy_do_obsluzenia_kel)
            {
                Potrawa potrawa = new Potrawa();
                potrawa.Cena = (double)item.Cena;
                potrawa.Id = item.Id;
                potrawa.Nazwa = item.Nazwa;
                potrawy.Add(potrawa);
            }

            try
            {
                if (!string.IsNullOrWhiteSpace(this.tbNrStolika.Text))
                    nrStolika = int.Parse(this.tbNrStolika.Text);
            }
            catch (Exception exc)
            {
                MessageBox.Show("Nr stolika nie jest liczba calkowita");
            }
            using (RestauracjaContext context = new RestauracjaContext())
            {
                if (context.PracownicyObslugi.Where(kuch => kuch.Id == AppSettings.LoggedUserId).Any())
                {
                    Obsluga kelner = context.PracownicyObslugi.Where(kuch => kuch.Id == AppSettings.LoggedUserId).First();
                    kelner.StworzZamowienie(potrawy, nrStolika);

                    this.potrawy_do_obsluzenia_kel.RemoveAll(pot => pot.Id != null);
                    lbPotrawyDoZamowienia.DataSource = null;
                    lbPotrawyDoZamowienia.Refresh();
                }
            }

            this.textBox2.Text = 0.ToString();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (lbPotrawyDoZamowienia.SelectedItem != null)
            {
                var potDoUsuniecia = (potrawyViewHelper)lbPotrawyDoZamowienia.SelectedItem;
                this.potrawy_do_obsluzenia_kel.Remove(potDoUsuniecia);

                this.textBox2.Text = this.potrawy_do_obsluzenia_kel.Sum(i => i.Cena).ToString();

                lbPotrawyDoZamowienia.DataSource = null;
                lbPotrawyDoZamowienia.Refresh();

                lbPotrawyDoZamowienia.DataSource = potrawy_do_obsluzenia_kel;
                lbPotrawyDoZamowienia.DisplayMember = "Nazwa";
                lbPotrawyDoZamowienia.ValueMember = "Id";
                lbPotrawyDoZamowienia.Refresh();
            }
        }

        private void lbPotrawyDoZamowienia_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void btnNoweOk_Click(object sender, EventArgs e)
        {
            using (RestauracjaContext context = new RestauracjaContext())
            {
                IQueryable<ZamowieniaPotrawy> quZamowieniaPotrawy = context.ZamowieniaPotrawy
                   .Where(zampotr => zampotr.CzyWydana == (int)ZamowieniePotrawaStatus.KuchniaZlecilaDoKelnera);

                if (quZamowieniaPotrawy.Any())
                {
                    foreach (var item in quZamowieniaPotrawy.ToList())
                    {
                        var temp = this.potrawy_do_wydania_kel.Where(pot => pot.Id == item.IdPotrawy).FirstOrDefault();
                        this.zamPotrDoZamkniecia.Add(item);

                        int nrStolika= context.Zamowienia.Where(zam => zam.Id == item.IdZamowienia).First().NrStolika;

                        potrawyViewHelper potrawa = new potrawyViewHelper();
                        potrawa.Nazwa = context.Potrawy.Where(pot => pot.Id == item.IdPotrawy).First().Nazwa + " s.: " + nrStolika;
                        potrawa.Id = context.Potrawy.Where(pot => pot.Id == item.IdPotrawy).First().Id;
                        potrawa.Cena = (decimal)context.Potrawy.Where(pot => pot.Id == item.IdPotrawy).First().Cena;

                        this.potrawy_do_wydania_kel.Add(potrawa);

                        lbZamowieniaDoRealizacji.DataSource = null;
                        lbZamowieniaDoRealizacji.Refresh();

                        lbZamowieniaDoRealizacji.DataSource = this.potrawy_do_wydania_kel;
                        lbZamowieniaDoRealizacji.DisplayMember = "Nazwa";
                        lbZamowieniaDoRealizacji.ValueMember = "Id";
                        lbZamowieniaDoRealizacji.Refresh();
                    }

                    this.btnNoweOk.Enabled = false;
                }
                else
                {
                    this.btnNoweOk.Enabled = true;
                }
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {

            if (lbZamowieniaDoRealizacji.SelectedItem != null)
            {
                var selectedItem = (potrawyViewHelper)lbZamowieniaDoRealizacji.SelectedItem;
                int id = 0;

                using (RestauracjaContext context = new RestauracjaContext())
                {
                    Obsluga kelner = context.PracownicyObslugi.Where(kuch => kuch.Id == AppSettings.LoggedUserId).First();
                    if (context.ZamowieniaPotrawy.Where(zampot => zampot.IdPotrawy == selectedItem.Id).Any())
                    {
                        //temp
                         List<ZamowieniaPotrawy> wszyustkie = context.ZamowieniaPotrawy.ToList();
                        var abc = wszyustkie.Where(w => w.IdPotrawy == selectedItem.Id).ToList();

                        var zamowieniePotrawa = context.ZamowieniaPotrawy.Where(zampot => zampot.IdPotrawy == selectedItem.Id &&  zampot.CzyWydana == 1).First();
                        id = zamowieniePotrawa.Id;

                        if (context.ZamowieniaPotrawy.Where(zampot => zampot.IdZamowienia == zamowieniePotrawa.IdZamowienia && 
                            zampot.CzyWydana != (int)ZamowieniePotrawaStatus.KelnerWydalKlientowi).Count() == 1)
                        {
                            var potrawa = context.Potrawy.First(pot => pot.Id == selectedItem.Id);
                            var zamowienie = context.Zamowienia.First(zam => zam.Id == zamowieniePotrawa.IdZamowienia);

                            kelner.WydajKlientowiPosilek(potrawa, zamowienie);
                            kelner.EdytujStatusZamowienie(zamowienie, Status.Zrealizowane);
                        }
                        else
                        {
                            var potrawa =  context.Potrawy.First(pot => pot.Id == selectedItem.Id);
                            var zamowienie = context.Zamowienia.First(zam => zam.Id == zamowieniePotrawa.IdZamowienia);

                            kelner.WydajKlientowiPosilek(potrawa, zamowienie);
                        }
                    }
                }

                this.potrawy_do_wydania_kel.Remove(selectedItem);

                if (this.potrawy_do_wydania_kel.Count == 0)
                {
                    this.btnNoweOk.Enabled = true;
                }


                using (RestauracjaContext context = new RestauracjaContext())
                {
                   ZamowieniaPotrawy zampotrawa  = context.ZamowieniaPotrawy.Where(kuch => kuch.Id == id).First();
                   var asd = context.Zamowienia.ToList();
                   var wew = context.ZamowieniaPotrawy.ToList();
                }


                lbZamowieniaDoRealizacji.DataSource = null;
                lbZamowieniaDoRealizacji.Refresh();

                lbZamowieniaDoRealizacji.DataSource = this.potrawy_do_wydania_kel;
                lbZamowieniaDoRealizacji.DisplayMember = "Nazwa";
                lbZamowieniaDoRealizacji.ValueMember = "Id";
                lbZamowieniaDoRealizacji.Refresh();
            }
        }


    }
}
